package cn.itcast.controller;

import cn.itcast.domain.User;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.bind.support.SessionStatus;

import java.util.Date;
import java.util.Map;

/**
 *  SpringMVC常用的注解
 */
@Controller
@RequestMapping("/anno")
/**
 * 作用：
 * 用于多次执行控制器方法间的参数共享。
 * 属性：
 * value：用于指定存入的属性名称
 * type：用于指定存入的数据类型。
 */
@SessionAttributes("msg")       // 把msg=美美存入到session域对中
public class AnnoController {

    /**
     *  作用：
     *      把请求中指定名称的参数给控制器中的形参赋值。
     *  属性：
     *      value： 请求参数中的名称。
     *      required：请求参数中是否必须提供此参数。 默认值： true。表示必须提供，如果不提供将报错。
     * @param username
     * @return
     */
    @RequestMapping("/testRequestParam")
    public String testRequestParam(@RequestParam(value = "name", required = false) String username) {
        System.out.println("执行了...");
        System.out.println(username);
        return "success";
    }

    /**
     *  获取请求体的内容
     *      针对post请求, get请求没有RequestBody
     * @param body
     * @return
     */
    @RequestMapping("/testRequestBody")
    public String testRequestBody(@RequestBody String body) {
        System.out.println("执行了...");
        System.out.println(body);
        return "success";
    }

    /**
     *  PathVariable注解
     * @param id
     * @return
     */
    @RequestMapping("/testPathVariable/{sid}")
    public String testPathVariable(@PathVariable("sid") String id) {
        System.out.println("执行了...");
        System.out.println(id);
        return "success";
    }

    /**
     * 获取请求头的值
     * @param header
     * @return
     */
    @RequestMapping("testRequestHeader")
    public String testRequestHeader(@RequestHeader("Accept") String header) {
        System.out.println("执行了...");
        System.out.println(header);
        return "success";
    }

    /**
     * 获取Cookie的值
     * @return
     */
    @RequestMapping("/testCookieValue")
    public String testCookieValue(@CookieValue(value = "JSESSIONID") String cookieValue) {
        System.out.println("执行了...");
        System.out.println(cookieValue);
        return "success";
    }

    @RequestMapping("testModelAttribute")
    public String testModelAttribute(@ModelAttribute("aaa") User user) {
        System.out.println("执行了...");
        System.out.println(user);
        return "success";
    }

    /**
     *  ModelAttribute出现在方法上，表示当前方法会在控制器的方法执行之前，先执行。它可以修饰没有返回值的方法，也可
     *  以修饰有具体返回值的方法。出现在参数上，获取指定的数据给参数赋值。
     */
/*    @ModelAttribute
    public User showUser(String uname) {
        System.out.println("showUser执行了...");
        // 通过用户查询数据库（模拟）
        User u = new User();
        u.setUname(uname);
        u.setAge(20);
        u.setDate(new Date());
        return u;
    }*/

    @ModelAttribute
    public void showUser(String uname, Map<String, User> map) {
        System.out.println("showUser执行了...");
        // 通过用户查询数据库（模拟）
        User u = new User();
        u.setUname(uname);
        u.setAge(20);
        u.setDate(new Date());
        map.put("aaa",u);
    }

    /**
     *
     * SessionAttributes的注解
     *
     * Model 是 spring 提供的一个接口，该接口有一个实现类 ExtendedModelMap
     * 该类继承了 ModelMap，而 ModelMap 就是 LinkedHashMap 子类
     * @param model
     * @return
     */
    @RequestMapping("testSessionAttributes")
    public String testSessionAttributes(Model model) {
        System.out.println("testSessionAttributes...");
        model.addAttribute("msg", "美美");
        //跳转之前将数据保存到 msg 中，因为注解@SessionAttribute 中有这几个参数
        return "success";
    }

    /**
     * 获取值
     * @param model
     * @return
     */
    @RequestMapping("getSessionAttributes")
    public String getSessionAttributes(ModelMap model) {
        System.out.println("getSessionAttributes...");
        System.out.println(model.get("msg"));
        return "success";
    }

    /**
     * 清除
     * @param status
     * @return
     */
    @RequestMapping(value="/delSessionAttributes")
    public String delSessionAttributes(SessionStatus status){
        System.out.println("getSessionAttributes...");
        status.setComplete();
        return "success";
    }
}
